// 定义reducer
import {
  ADD_TODO,
  UPDATE_TODO,
  DELETE_TODO,
  UPDATE_ALL_TODO,
  CLEAR_ALL_DONE,
} from './constants'
const initState = {
  list: [
    {
      id: 1,
      todoName: '吃饭',
      isDone: true,
    },
    {
      id: 2,
      todoName: '睡觉',
      isDone: false,
    },
  ],
}
export default function reducer(state = initState, action) {
  let newList // 由于每次操作都需要一个新的数组,所以在当前reducer的顶级作用域定义变量,用来存储每一次的新数据
  switch (action.type) {
    case ADD_TODO:
      // 根据传递过来的任务名,创建一个新的任务对象,将新的任务对象,添加到list里面
      // action.todoName 新的任务名
      const todo = {
        id: Date.now(),
        todoName: action.todoName,
        isDone: false,
      }
      // 根据旧数据,创建新数据,往新数据中添加
      newList = [...state.list]
      newList.push(todo)

      return {
        ...state,
        list: newList,
      }

    case UPDATE_TODO:
      //action.id 就是要被修改的数据的id
      // newList = [...state.list]
      // 遍历newList,遍历过程中,修改制定数据的isDone
      // 注意: 当前数组中的对象地址是没有发生变化的,所以导致直接修改对象中的属性,在性能优化检查时,没有发现数据变化,导致我们的展示组件没有更新
      // newList.forEach((item) => {
      //   if (item.id === action.id) {
      //     item.isDone = !item.isDone
      //   }
      // })

      // 用map返回一个新的数组
      newList = state.list.map((item) => {
        if (item.id === action.id) {
          item.isDone = !item.isDone
        }
        // return 一个新的对象
        return { ...item }
      })

      return {
        ...state,
        list: newList,
      }

    case DELETE_TODO:
      newList = state.list.filter((item) => item.id !== action.id)
      return {
        ...state,
        list: newList,
      }

    case UPDATE_ALL_TODO:
      // 点击全选按钮的逻辑:
      // 遍历数组,遍历过程中,判断是不是数组中每一个任务对象都是选中的,如果每一个都选中,接下来都变成不选中. 如果数组中有一个不选中,接下来所有的都变成选中
      const isAllCheck = state.list.every((item) => {
        return item.isDone
      })

      newList = state.list.map((item) => {
        item.isDone = !isAllCheck
        return { ...item }
      })

      return {
        ...state,
        list: newList,
      }

    case CLEAR_ALL_DONE:
      newList = state.list.filter((item) => !item.isDone)
      return {
        ...state,
        list: newList,
      }

    default:
      return state
  }
}
